﻿/*!
 * Copyright (c), 上海沃恩信息科技有限公司.
 * All rights reserved.
 * Licensed under BSD (https://www.pittypat.work/bsd.html).
 */

using System;
using System.IO;

namespace Pittypat
{
    /// <summary>
    /// 定义匿名用户的用户信息。匿名用户的 Id 总是 null。
    /// </summary>
    sealed class User : IUser
    {
        static IUser anonymous = null;
        static readonly object anonymousRoot = new object();

        /// <summary>
        /// 获取一个不允许执行当前操作的匿名用户。
        /// </summary>
        internal static IUser Anonymous
        {
            get
            {
                if (anonymous == null)
                {
                    lock (anonymousRoot)
                    {
                        if (anonymous == null)
                        {
                            anonymous = new User();
                        }
                    }
                }

                return anonymous;
            }
        }

        /// <summary>
        /// 初始化 User 类的新实例。
        /// </summary>
        private User()
        {
        }

        /// <summary>
        /// 获取用户的 Id，总是为 null。
        /// </summary>
        @uuid? IUser.Id
        {
            get
            {
                return null;
            }
        }

        /// <summary>
        /// 获取用户的登录名称，总是为空字符串。
        /// </summary>
        @string? IUser.LoginName
        {
            get
            {
                return "";
            }
        }

        /// <summary>
        /// 获取用户的友好显示名称，总是为空字符串。
        /// </summary>
        @string? IUser.FriendlyName
        {
            get
            {
                return "";
            }
        }

        /// <summary>
        /// 获取用户头像的路径，总是为空字符串。
        /// </summary>
        @string? IUser.FaceUrl
        {
            get
            {
                return "";
            }
        }

        /// <summary>
        /// 获取用户登录成功后应该进入的第一个页面，总是为空字符串。
        /// </summary>
        @string? IUser.LoginHomeUrl
        {
            get
            {
                return "";
            }
        }

        /// <summary>
        /// 获取用于设置用户资料的路径，总是为空字符串。
        /// </summary>
        @string? IUser.SettingUrl
        {
            get
            {
                return "";
            }
        }

        /// <summary>
        /// 获取当前系统的日期时间，总是为当前日期时间。
        /// </summary>
        @datetime? IUser.Now
        {
            get
            {
                return @datetime.Now;
            }
        }

        /// <summary>
        /// 将当前对象作为 JSON 字符串写入指定的文本流。
        /// </summary>
        /// <param name="writer">目标文本流。</param>
        void IJson.Write(TextWriter writer)
        {
            if (writer == null)
            {
                throw new ArgumentNullException("writer");
            }

            writer.Write("{\"id\":null,\"loginName\":\"\",\"friendlyName\":\"\",\"faceUrl\":\"\",\"loginHomeUrl\":\"\",\"settingUrl\":\"\",\"now\":");
            ((IUser)this).Now.Write(writer);
            writer.Write('}');
        }
    }
}
